﻿// 604 数数3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <memory.h>
using namespace std;
/*

http://oj.daimayuan.top/course/5/problem/248
读入 l,r
，请求出 [l,r]
 中有多少个数字 a
 满足数字中存在 3 个连续的数位 ai,ai+1,ai+2
 使得 ai<ai+1<ai+2
，其中 ai
 表示 a
 从左到右数第 i
 位上的值。

输入格式
一行两个整数 l,r
。

输出格式
一行一个整数表示答案。

样例输入
1 1000
样例输出
84
数据范围
对于 100%
 的数据，保证 1≤l≤r≤1016
。
*/

long long l, r, f[18][10][3][2];
int c[21];

int get_status(int status, int x,int y) {
	if (status == 2)
		return 2;
	if (x >= y)
		return 0;
	return status + 1;
}


long long calc(long long n) {
	if (!n)
		return 0;
	int m = 0;
	for (; n; n /= 10)
		c[++m] = n % 10;
	for (int i = 1, j = m; i < j; i++, j--) {
		swap(c[i], c[j]);
	}
	long long res = 0;
	int status = 0;
	for (int i = 1; i <= m; i++) {
		for (int j = 0; j < c[i]; j++) {
			int ns = get_status( status,c[i-1],j);
			if (i == 1)
				ns = 0;
			memset(f, 0, sizeof f);
			if (i == 1 && !j) {
				f[i][j][0][0] = 1;
			}
			else {
				f[i][j][ns][1] = 1;
			}

			for (int k = i + 1; k <= m; k++) {
				for (int w = 0; w < 10; w++) {
					for (int l = 0; l < 3; l++) {
						for (int q = 0; q < 2; q++) {
							if (f[k - 1][w][l][q])
								for (int x = 0; x < 10; x++)
									if (!q && !x)
										f[k][0][0][0] += f[k - 1][0][0][0];
									else
										if(q)
											f[k][x][get_status(l, w,x)][1] += f[k - 1][w][l][q];
										else 
											f[k][x][0][1] += f[k - 1][w][l][q];
						}
					}
				}
			}

			for (int k = 0; k < 10; k++)
				res += f[m][k][2][1];
		}

		if (i != 1)
			status = get_status(status, c[i - 1], c[i]);
		else
			status = 0;
	}
	if (status == 2)
		++res;

	return res;
}


int main()
{
	scanf("%lld%lld", &l, &r);
	printf("%lld\n", calc(r) - calc(l - 1));

	return 0;
}

 